<?php

require_once APPPATH . 'dao/CobradorZonaDAO.php';
require_once APPPATH . 'dao/SocioDAO.php';
require_once APPPATH . 'dao/CobradorDAO.php';
require_once APPPATH . 'dao/CuponDAO.php';
require_once APPPATH . 'dao/SocioServicioAdicionalDAO.php';
require_once APPPATH . 'dao/EstadoCierreRecaudacionDAO.php';
require_once APPPATH . 'dao/TipoDocumentoDAO.php';
require_once APPPATH . 'dao/CategoriaDAO.php';

class Cupones extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function index() {
        
        $socioModel = new models\M_socio();
        $socioModel->actualizarEstadosSocios(date('d'), date('m'), date('Y'));
//        $this->actualizarEstadosSocios();

        $estadoDAO = new \EstadoCierreRecaudacionDAO();

        $estado = $estadoDAO->getEstadoCierreRecaudacion();

        if ($estado->getEmisionHabilitada()) {
            $cuponModel = new models\M_cupon();
            $cuponModel->generarCupones(date('d'), date('m'), date('Y'));
//            $this->generarCupones();

            $cupones = $cuponModel->getCuponesNoPagados();

            if ($cupones === FALSE) {
                $data['cuponesYservicios'] = '';
                $data['resumenCupones'] = '';
            } else {
                $data['cuponesYservicios'] = $this->ordenarCuponesYServicios($cupones);
                $data['resumenCupones'] = $this->obtenerResumenCupones();
                $this->registrarAperturaMes();
            }
        } else {
            $data['cuponesYservicios'] = '';
            $data['resumenCupones'] = '';
            $data['mensaje'] = 'La Recaudación del mes anterior no se ha cerrado';
        }

        $dataCab['title'] = 'Sistema de Administración de Socios';
        $dataCab['textoSuperiorIzq'] = 'DEFENSORES DE LA TECNO';
        $dataCab['css'] = '<link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/css_pestanias.css" media="screen" />
                           <link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/datos_form_css.css" media="screen" />';


        $dataCab['nombre'] = 'Administrador';
        $dataCab['posicionamiento'] = 'Home > Generar Cupones';

        $this->load->view('cabecera', $dataCab);
        $this->load->view('cupones', $data);
        $this->load->view('cierre');
    }

    private function registrarAperturaMes() {

        $estadoDAO = new \EstadoCierreRecaudacionDAO();

        $estado = $estadoDAO->getEstadoCierreRecaudacion();

        $estado->setEmisionHabilitada(FALSE);

        $estadoDAO->em->persist($estado);

        $estadoDAO->em->flush();
    }

    private function obtenerResumenCupones() {

        $cuponDAO = new \CuponDAO();

        return $cuponDAO->getResumenCuponesNoPagados();
    }

    private function ordenarCuponesYServicios($cupones) {

        $arrayCuponesYServicios = array();

        foreach ($cupones as $cupon) {

            $a = array();
            $a[] = $cupon;
            $a[] = $this->buscarServiciosAdicionales($cupon->getSocio()->getId(), $cupon->getSocio()->getCategoria()->getId());

            $arrayCuponesYServicios[] = $a;
        }

        return $arrayCuponesYServicios;
    }

    private function buscarServiciosAdicionales($idSocio, $idCategoria) {

        $socioServAd = new \SocioServicioAdicionalDAO();

        return $socioServAd->getServiciosDeSocio($idSocio, $idCategoria);
    }

    private function realizarConsultaCupones() {

        $cuponDAO = new \CuponDAO();

        return $cuponDAO->getCuponesNoPagados();
    }

    /*
     * Se encarga de invocar el método que finalmente realizará la consulta a la BD
     */

    private function generarCupones() {
        //Se instancioa SocioDAO
        $cobradorZonaDAO = new \CobradorZonaDAO();
        //Se invoca un método en SocioDAO para recuperar los socios que cumplan
        //las reglas de filtrado
        $cobradores = $cobradorZonaDAO->getCobradoresYZonas();

        $socioDAO = new \SocioDAO();

        $cuponDAO = new \CuponDAO();

        $fechaVencimiento = date('Y-m-d', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));
        $mesVencimiento = date('m', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));
        $anioVencimiento = date('Y', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));

        foreach ($cobradores as $cobrador) {

            $socios = $socioDAO->getSociosCobrablesEnZona($cobrador->getZona()->getId());

            if (!($socios === FALSE))
                foreach ($socios as $socio) {

                    if (!$cuponDAO->existeCupon($cobrador->getId(), $socio->getId(), $fechaVencimiento, $mesVencimiento, $anioVencimiento)) {

                        $cuponDAO->generarCupon($cobrador->getId(), $socio->getId(), $fechaVencimiento, $mesVencimiento, $anioVencimiento);

//                        if ($socio->getEstado()->getId() == 0)
//                            $socioDAO->habilitarSocio(1, $fechaVencimiento, $socio->getId());
                    }
                }
        }
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function actualizarEstadosSocios() {

        $socioDAO = new \SocioDAO();
        $socios = $socioDAO->getSocios();

        $cuponDAO = new \CuponDAO();

        $anioActual = date("Y");
        $mesActual = date("m");
        $diaActual = date("d");

        //Para cada socio en el sistema, se verifica su estado actual con la fecha del sistema y se verifica
        //si se le ha vencido el plazo de pago. De ser así se lo pasa al siguiente estado, según corresponda.
        if (!empty($socios)) {

            foreach ($socios as $socio) {

                if ($socio->getEstado()->getId() == 0) {

                    $fechaVencimiento = date('Y-m-d', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));
                    $mesVencimiento = date('m', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));
                    $anioVencimiento = date('Y', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));

                    $socioDAO->habilitarSocio(1, $fechaVencimiento, $socio->getId());
                } else {

                    $idSocio = $socio->getId();
                    $idEstado = $socio->getEstado()->getId();

                    $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');
                    $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                    $diaVencimientoEstado = $socio->getVencimientoEstado()->format('d');

                    if ($this->fechaMayor($diaVencimientoEstado, $mesVencimientoEstado, $anioVencimientoEstado, $diaActual, $mesActual, $anioActual)) {

                        switch ($idEstado) {
                            case 1:
                                if ($cuponDAO->getCuponesNoPagadosVencidos($idSocio) > 0)
                                    $idEstado = 2;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+1 month')->format('d');
                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                                break;

                            case 2:
                                if ($cuponDAO->getCuponesNoPagadosVencidos($idSocio) == 0) {
                                    $idEstado = 1;
                                    $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+1 month')->format('d');
                                } else if ($cuponDAO->getCuponesNoPagadosVencidos($idSocio) == 1)
                                    $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+1 month')->format('d');
                                else {
                                    $idEstado = 3;
                                    $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+12 month')->format('d');
                                }

                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                                break;

                            case 3:
                                $idEstado = 4;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+36 month')->format('d');
                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                                break;

                            case 4:
                                $idEstado = 5;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+99 year')->format('d');
                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                                break;
                        }
                    }

                    $socioDAO->actualizarEstadoSocio($idSocio, $idEstado, $diaVencimientoEstado, $mesVencimientoEstado, $anioVencimientoEstado);
                }
            }
        }
    }

    /**
     * Función accesoria que compara las fechas recibidas como parámetro, separadas en 3 argumentos
     * para cada fecha.
     * 
     * @param type $dia1
     * @param type $mes1
     * @param type $anio1
     * @param type $dia2
     * @param type $mes2
     * @param type $anio2
     * @return boolean 
     */
    private function fechaMayor($dia1, $mes1, $anio1, $dia2, $mes2, $anio2) {

        $mayor = FALSE;

        if (((int) $anio2 > (int) $anio1) || ((int) $anio2 == (int) $anio1 && (int) $mes2 > (int) $mes1) ||
                ((int) $anio2 == (int) $anio1 && (int) $mes2 == (int) $mes1 && (int) $dia2 > (int) $dia1))
            $mayor = TRUE;

        return $mayor;
    }

    public function test() {

        // Por ahora hago todas las pruebas  de generacion de cupones con un solo socio




        $i = 0;

        $cuponDAO = new \CuponDAO();

        //
        //WARNING!!!!!!Para ejecutar las pruebas se limpia la tabla cupon
        $cuponDAO->vaciarTabaCupon();


        $this->generarCupones(); //se corre el scrip de generar cupones para estos 4 usuarios

        $fecha_venc = date('Y-m-d', mktime(0, 0, 0, date("m") + 1, date("d") - 1, date("Y")));



        //Prueba 1: Se genera el cupon para es socio 20 cupon 1 id_socio = 20 id_cobrador=3  

        $test = $cuponDAO->getArrayCuponesNoPagadosBySocioTest(1000000);



        $expected_result['socio_id'] = '1000000';
        $expected_result['cobrador_id'] = '4';
        $expected_result['fecha_vencimiento'] = $fecha_venc;
        $expected_result['pagado'] = 'f';


        $test_name = 'Prueba ' . ++$i . ' - Generacion del primer cupon para un usuario nuevo';
        $this->unit->run($test, $expected_result, $test_name);

        //Prueba 2: se deberia generar cupon para el socio 21 Estado = Moroso
        $test = $cuponDAO->getArrayCuponesNoPagadosBySocioTest(1000002);



        $expected_result['socio_id'] = '1000002';
        $expected_result['cobrador_id'] = '4';
        $expected_result['fecha_vencimiento'] = $fecha_venc;
        $expected_result['pagado'] = 'f';

        $test_name = 'Prueba ' . ++$i . ' - Generacion del cupon para un usuario moroso';
        $this->unit->run($test, $expected_result, $test_name);

        //prueba 3: no se deberia generar cupon para el usuario 22 Estado = Baja Tecnica
        $test = $cuponDAO->getArrayCuponesNoPagadosBySocioTest(1000003);
        $expected_result = False;
        $test_name = 'Prueba ' . ++$i . ' - NO generar el cupon para un usuario Baja Tecnica';
        $this->unit->run($test, $expected_result, $test_name);

        //prueba 4: no se deberia generar cupon para el usuario 23 Estado = Baja Total
        $test = $cuponDAO->getArrayCuponesNoPagadosBySocioTest(1000004);
        $expected_result = False;
        $test_name = 'Prueba ' . ++$i . ' - NO generar el cupon para un usuario Baja Total';
        $this->unit->run($test, $expected_result, $test_name);



        //reportes
        echo $this->unit->report();
    }

}

?>
